package zx.lrn.notes.multi_threading;

import java.time.LocalDateTime;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 *
 * @ClassName: CallableAndFutureTask
 * @Description: 创建线程的第三种方式：FutureTask 创建线程可以extend Thread也可以implement Runnable,但此两种都是无返回值。此外还有通过FutureTask的方式获取线程的返回值
 *               FutureTask实际实现了Future和Runnable接口，因此可以作为Thread实例的构造参数，同时FutureTask持有一个Callable对象，
 *               调用Thread的start实则会调用FutureTask的run，而FutureTask的run会委托给Callable的call，
 *               当调用FutureTask的get获取返回值时，会返回Callable的call的返回，当Callable未执行完，get会阻塞，直到Callable的call执行完毕。
 * @Author: zhaoxuan
 * @Date: 2020/3/12 1:11
 **/
public class CallableAndFutureTask {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(LocalDateTime::now);
        new Thread(futureTask).start();
        System.out.println(futureTask.get());
    }
}
